package com.hmall.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @author ajin
 * @create 2024-08-02 20:42
 */
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
    /**
     * 重写filter方法，实现全局过滤器的功能
     * 主要用于在请求处理前执行一些预处理逻辑，并在请求处理后执行一些后处理逻辑
     *
     * @param exchange ServerWebExchange对象，代表当前的服务器Web交换，包含了请求和响应的所有信息
     * @param chain GatewayFilterChain对象，代表过滤器链，通过调用它的filter方法可以继续执行下一个过滤器
     * @return 返回一个Mono<Void>对象，表示异步处理的完成信号
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 获取当前的服务器请求对象
        ServerHttpRequest request = exchange.getRequest();
        // 打印出GlobalFilter的pre阶段执行信息，表明此过滤器的预处理阶段开始执行
        System.out.println("GlobalFilter pre阶段执行了。");
        // 获取请求的头部信息
        HttpHeaders headers = request.getHeaders();
        // 打印请求的头部信息，这可能有助于调试和分析请求
        System.out.println(headers);
        // 继续执行下一个过滤器，并返回其处理结果
        return chain.filter(exchange);
    }


    /**
     * 返回当前对象的执行顺序
     *
     * @return 当前对象的执行顺序，返回值为一个整数，表示在一组对象中的执行先后关系
     */
    @Override
    public int getOrder() {
        //过滤器执行顺序，值越小，优先级越高
        return 0;
    }

}
